package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
)

// User 定义了一个用户结构体，包含姓名和年龄
type User struct {
	Name string
	Age  int
}

// m10 是一个中间件函数，用于设置上下文数据
func m10(c *gin.Context) {
	fmt.Println("m10...in")
	// 使用c.Set向gin的上下文中存储数据
	c.Set("num", 10)
	c.Set("user", User{"zhangsan", 18})
	// 调用c.Next()来执行下一个中间件或路由处理函数
	c.Next()
	fmt.Println("m10...out")
}

// m11 是一个中间件函数，用于获取上下文数据
func m11(c *gin.Context) {
	fmt.Println("m11...in")
	// 使用c.Get从gin的上下文中获取数据，exists用于判断数据是否存在
	value, exists := c.Get("num")
	if exists {
		fmt.Println(value)
	}
	// c.MustGet确保数据一定存在，如果不存在会返回一个panic
	fmt.Println(c.MustGet("user"))
	_user, _ := c.Get("user")
	// 类型断言，将接口类型转换为User类型，并访问Name字段
	fmt.Println(_user.(User).Name)
	// 调用c.Next()来执行下一个中间件或路由处理函数
	c.Next()
	fmt.Println("m11...out")
}

func main() {
	// 创建默认的gin路由器
	r := gin.Default()
	// 使用r.Use将m10和m11中间件绑定到每个请求中
	r.Use(m10, m11)
	// 定义路由/m10，响应GET请求，返回JSON数据
	r.GET("/m10", func(c *gin.Context) {
		c.JSON(200, gin.H{"msg": "m10"})
	})
	// 定义路由/m11，响应GET请求，返回JSON数据
	r.GET("/m11", func(c *gin.Context) {
		c.JSON(200, gin.H{"msg": "m11"})
	})
	// 启动gin服务器，监听localhost的8080端口
	r.Run("localhost:8080")
}
